package sh.orm;

import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import sh.base.aop.util.ScannerUtil;

import java.util.*;

/**
 * 管家，保管一个entity和表的映射关系
 * 这里的数据是静态数据，只要类生命完成，对应的数据库字段就是固定的。
 *
 * 因为需要返回自定义的类型，所以还需要加入更多的静态数据，比如 各种Dto
 * @author lqq
 * @date 2019/1/22
 */
@Data
@Slf4j
public class StaticEntityHolder {

    /**
     * 根据每个类获取元数据
     */
    private static Map<Class<?>,StaticEntity> staticEntityMap = new HashMap<>( );

    /** 其他返回值类型 */
    private static Map<Class<?>,StaticEntity> otherReturnTypeMap = new HashMap<>( );

    static {

        Set<Class<?>> classes = ScannerUtil.getClasses("sh.model",true);

        log.info("通过扫描获取的Entity类：" + classes);
        for(Class<?> clazz : classes){
            StaticEntity staticEntity = new StaticEntity(clazz);
            staticEntityMap.put(clazz,staticEntity);
        }

        // 扫描其他返回值的类型,用户orm返回结果的对象
        Set<Class<?>> otherClasses = ScannerUtil.getClasses("sh.dto",true);
        for(Class<?> clazz : otherClasses){
            StaticEntity staticEntity = new StaticEntity(clazz);
            otherReturnTypeMap.put(clazz,staticEntity);
        }


    }

    public static StaticEntity getStaticEntity(Class<?> clazz) {
        StaticEntity staticEntity = staticEntityMap.get(clazz);
        if(staticEntity != null){
            return staticEntity;
        }
        staticEntity = otherReturnTypeMap.get(clazz);

        if(staticEntity != null){
            return staticEntity;
        }

        return null;
    }




}
